/**
 * import DateFormatUtil from "@/utils/DateFormatUtil.js";
 *
 * const now = new Date();
 *
 * console.log(DateFormatUtil.formatDate(now));        // 2025-09-26
 * console.log(DateFormatUtil.formatDateTime(now));    // 2025-09-26 22:15:30
 * console.log(DateFormatUtil.formatCNDate(now));      // 2025年09月26日
 * console.log(DateFormatUtil.formatCNDateTime(now));  // 2025年09月26日 22时15分30秒
 */
export default class DateFormatUtil {
  /**
   * 格式化日期
   * @param {Date | number | string} date 日期对象、时间戳或可解析的日期字符串
   * @param {string} format 格式化模板
   * 支持：
   *   yyyy-MM-dd
   *   yyyy-MM-dd HH:mm:ss
   *   yyyy年MM月dd日
   *   yyyy年MM月dd日 HH时mm分ss秒
   * @returns {string}
   */
  static format(date, format = 'yyyy-MM-dd') {
    if (!date) return ''

    // 处理参数类型
    if (!(date instanceof Date)) {
      date = new Date(date)
    }

    const padZero = (n) => (n < 10 ? '0' + n : n)

    const map = {
      yyyy: date.getFullYear(),
      MM: padZero(date.getMonth() + 1),
      dd: padZero(date.getDate()),
      HH: padZero(date.getHours()),
      mm: padZero(date.getMinutes()),
      ss: padZero(date.getSeconds())
    }

    return format.replace(/yyyy|MM|dd|HH|mm|ss/g, (match) => map[match])
  }

  // 常用快捷方法
  static formatDate(date) {
    return this.format(date, 'yyyy-MM-dd')
  }

  static formatDateTime(date) {
    return this.format(date, 'yyyy-MM-dd HH:mm:ss')
  }

  static formatCNDate(date) {
    return this.format(date, 'yyyy年MM月dd日')
  }

  static formatCNDateTime(date) {
    return this.format(date, 'yyyy年MM月dd日 HH时mm分ss秒')
  }
}
